1 module geany_dlang.config_window; 2 3 import gtk.Widget: GtkWidget, GtkDialog; 4 import geany_d_binding.geany.plugins; 5 import geany_d_binding.geany.types; 6 import logger: nothrowLog; 7 import geany_dlang.plugin: configFile; 8 import gtk.Builder; 9 10 extern(System) GtkWidget* configWindowDialog(GeanyPlugin* plugin, GtkDialog* dialogPtr, gpointer pdata) nothrow 11 { 12 import geany_dlang.config; 13 import gtk.Box; 14 import gtk.TreeView; 15 import gtk.CellRendererText; 16 import gtk.Dialog; 17 import gobject.Signals; 18 19 nothrowLog!"trace"(__FUNCTION__); 20 21 try 22 { 23 immutable guiDescr = import("preferences.glade"); 24 auto builder = new Builder(); 25 builder.addFromString(guiDescr); 26 27 fillPrefsFromConfig(builder); 28 29 auto pathCellRenderer = cast(CellRendererText) builder.getObject("path_cell_renderer"); 30 pathCellRenderer.addOnEdited( 31 (string position, string val, CellRendererText cell) 32 { 33 import gtk.TreePath; 34 import gtk.TreeIter; 35 36 auto path = new TreePath(position); 37 auto list = builder.getPathsList; 38 auto iter = new TreeIter(list, path); 39 list.setValue(iter, COLUMN_PATH, val); 40 } 41 ); 42 43 auto box = cast(Box) builder.getObject("main_box"); 44 box.showAll; 45 46 void on_configure_response(int response, Dialog d) 47 { 48 const r = cast(GtkResponseType) response; 49 50 if (r == GtkResponseType.OK || r == GtkResponseType.APPLY) 51 { 52 nothrowLog!"trace"("Save config"); 53 54 savePrefsToConfig(builder); 55 configFile.saveConf(); 56 57 import geany_dlang.plugin; 58 wrapper.substituteDcdPaths(configFile.config.additionalPaths); 59 } 60 } 61 62 auto dialog = new Dialog(dialogPtr); 63 dialog.addOnResponse(&on_configure_response); 64 65 return cast(GtkWidget*) box.getBoxStruct; 66 } 67 catch(Exception e) 68 { 69 nothrowLog!"fatal"(e); 70 71 return null; 72 } 73 } 74 75 import gtk.ListStore; 76 77 private enum 78 { 79 COLUMN_ENABLED, 80 COLUMN_PATH, 81 } 82 83 import gtk.ToggleButton; 84 85 private auto getCharAddCheckBox(Builder b) 86 { 87 return cast(ToggleButton) b.getObject("capture_charadded_checkbox"); 88 } 89 90 private auto getPathsList(Builder b) 91 { 92 return cast(ListStore) b.getObject("dir_list_store"); 93 } 94 95 private void fillPrefsFromConfig(Builder b) 96 { 97 b.getCharAddCheckBox.setActive = configFile.config.useCharAddEvent; 98 99 auto list = b.getPathsList; 100 list.clear; 101 102 foreach(path; configFile.config.additionalPaths) 103 { 104 auto iterator = list.createIter(); 105 list.setValue(iterator, COLUMN_PATH, path); 106 } 107 } 108 109 private void savePrefsToConfig(Builder b) 110 { 111 configFile.config.useCharAddEvent = b.getCharAddCheckBox.getActive; 112 113 configFile.config.additionalPaths.length = 0; 114 115 auto list = b.getPathsList; 116 117 auto iterator = list.createIter; 118 list.getIterFirst(iterator); 119 iterator.setModel(list); 120 121 do { 122 configFile.config.additionalPaths ~= iterator.getValueString(COLUMN_PATH); 123 } 124 while(list.iterNext(iterator)); 125 126 // removes latest null string 127 configFile.config.additionalPaths = configFile.config.additionalPaths[0 .. $-1]; 128 }